﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio = PSE.Tools.CadastroMensagens.Negocio;
using NegocioProdutos = PSE.Tools.CadastroProdutos.Negocio;
using Entidades = PSE.Tools.CadastroMensagens.Entidades;
using EntidadesProdutos = PSE.Tools.CadastroProdutos.Entidades;
using Apresentacao = PSE.Tools.CadastroMensagens.Apresentacao;
using PSE.Tools.Util.Entidades;
namespace Web.Paginas
{
    public partial class Produtos : Base.PaginaBase, Apresentacao.IApresentacao
    {
        #region [ Variaveis ]
        private Apresentacao.Produtos _apresentacao;
        #endregion [ Variaveis ]

        #region [ Contrutores ]
        public Produtos()
        {
            _apresentacao = new Apresentacao.Produtos(this, new NegocioProdutos.Produtos());
        }
        #endregion [ Contrutores ]

        #region [ Eventos ]
        protected override void OnLoad(EventArgs e)
        {
            lnkNovo.Click += new EventHandler(lnkNovo_Click);
            lnkCancelar.Click += new EventHandler(lnkCancelar_Click);

            btnInserir.Click += new ImageClickEventHandler(btnInserir_Click);

            grid.ItemCommand += new RepeaterCommandEventHandler(grid_ItemCommand); 
            if(!IsPostBack)
            {
                IniciaGrid();
            }
        }

        protected void grid_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            int id = 0;
            int.TryParse(e.CommandArgument.ToString(), out id);            
            if (e.CommandName.Equals("Editar"))
            {
                Carregar(id);
            }
            if (e.CommandName.Equals("Excluir"))
            {
                Excluir(id);
            }
        }

        protected void btnInserir_Click(object sender, ImageClickEventArgs e)
        {
            Salvar();
        }

        protected void lnkNovo_Click(object sender, EventArgs e)
        {
            Novo();
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            Cancelar();
        }
        #endregion [ Eventos ]

        #region [ Métodos ]
        private void Salvar()
        {
            bool retorno = false;
            EntidadesProdutos.Produto produto = new EntidadesProdutos.Produto();

            int id = 0;
            int.TryParse(txtId.Value, out id);
            produto.Id = id;
            produto.Nome = txtNome.Text;

            if(string.IsNullOrEmpty(txtId.Value))
                retorno = _apresentacao.Inserir(produto);
            else
                retorno = _apresentacao.Atualizar(produto);

            if (retorno)
                IniciaGrid();

            form.Visible = !retorno;
        }

        private void LimparCampos()
        {
            txtId.Value = string.Empty;
            txtNome.Text = string.Empty;
        }

        private void Novo()
        {
            LimparCampos();
            form.Visible = true;
            lblNome.Text = string.Empty;
            lblMensagem.Text = string.Empty;
        }

        private void Carregar(int id)
        {
            Novo();
            EntidadesProdutos.Produto produto = _apresentacao.Obter(id);
            txtId.Value = produto.Id.ToString();
            txtNome.Text = produto.Nome;
        }

        private void Excluir(int id)
        {
            EntidadesProdutos.Produto produto = _apresentacao.Obter(id);
            _apresentacao.Excluir(produto);
            IniciaGrid();
        }

        private void Cancelar()
        {
            LimparCampos();
            form.Visible = false;
            lblMensagem.Text = "";
        }

        private void IniciaGrid()
        {
            var itens = _apresentacao.Lista();
            grid.DataSource = itens;
            grid.DataBind();
            lblQtdItens.Text = itens.Count.ToString();
        }

        public void EnviarMensagem(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.CssClass = "fraseDestaque sucesso";
        }

        public void EnviarMensagemErro(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.CssClass = "fraseDestaque erro";
        }

        public void EnviarMensagemValidacao(IEnumerable<ValidacaoEntidade> validacoes)
        {
            foreach (var validacao in validacoes)
                EnviarMensagemValidacao(validacao);
        }

        public void EnviarMensagemValidacao(ValidacaoEntidade validacao)
        {
            if (validacao.NomePropriedade == "Nome")
            {
                lblNome.CssClass = "atencao";
                lblNome.Text = validacao.Mensagem;
            }

            lblMensagem.CssClass = "fraseDestaque atencao";
            lblMensagem.Text = "Verifique os campos abaixo...";
        }
        #endregion [ Métodos ]
    }
}
